#include "S2.h"
#include "systick.h"

/*********************************************************************************************
函数名:    s2_init
入口参数:  address:S1子板的i2c起始地址
出口参数： 无
返回值：   初始化后的i2c地址结构体，如果初始化成功则结构体中的flag为1
作者：     XQii
日期:      2023/4/30
调用描述:  初始化S2子板中的某个芯片
**********************************************************************************************/
i2c_addr_def s2_init(uint8_t address)
{
    i2c_addr_def result;

    result = get_board_address(address);

    if (result.flag == 1)
    {
        if (result.addr == BH1750_ADDRESS_S2 || result.addr == BH1750_ADDRESS_S2 + 0x72)
            bh1750_init(result.periph, result.addr);
        if (result.addr == SHT35_ADDRESS_S2 || result.addr == SHT35_ADDRESS_S2 + 0x02)
            sht35_init(result.periph, result.addr);
        if (result.addr == ICM20608_ADDRESS_S2 || result.addr == ICM20608_ADDRESS_S2 + 0x02)
            icm20608_init(result.periph, result.addr);
    }

    return result;
}


/*********************************************************************************************
函数名:    s2_all_init
入口参数:  s2_address:指向所有E1子板的指针  bh1750_addr:bh1750芯片基地址  icm20608_addr:icm20608_addr芯片基地址  sht35_addr:sht35_addr芯片基地址
出口参数： 无
返回值：   无
作者：     XQii
日期:      2023/4/30
调用描述:  初始化所有S2子板
**********************************************************************************************/
void s2_all_init(s2_addr_def *s2_address,uint8_t bh1750_addr,uint8_t icm20608_addr,uint8_t sht35_addr)
{
    s2_address->bh1750_addr[0] = s2_init(BH1750_ADDRESS_S2);
    s2_address->bh1750_addr[1] = s2_init(BH1750_ADDRESS_S2 + 0x72);
    s2_address->icm20608_addr[0] = s2_init(ICM20608_ADDRESS_S2);
    s2_address->icm20608_addr[1] = s2_init(ICM20608_ADDRESS_S2 + 0x02);
    s2_address->sht35_addr[0] = s2_init(SHT35_ADDRESS_S2);
    s2_address->sht35_addr[1] = s2_init(SHT35_ADDRESS_S2 + 0x02);
}


/*********************************************************************************************
函数名:    bh1750_init
入口参数:  periph:I2C外设  address:bh1750芯片地址
出口参数： 无
返回值：   无
作者：     XQii
日期:      2023/4/30
调用描述:  初始化S2子板中的bh1750芯片
**********************************************************************************************/
void bh1750_init(uint32_t periph, uint8_t address)
{
    // 上电
    i2c_cmd_write(periph, address, 0x01);
}


/*********************************************************************************************
函数名:    sht35_init
入口参数:  periph:I2C外设  address:sht35芯片地址
出口参数： 无
返回值：   无
作者：     XQii
日期:      2023/4/30
调用描述:  初始化S2子板中的sht35芯片
**********************************************************************************************/
void sht35_init(uint32_t periph, uint8_t address)
{
    //TODO:
}


/*********************************************************************************************
函数名:    icm20608_init
入口参数:  periph:I2C外设  address:icm20608芯片地址
出口参数： 无
返回值：   无
作者：     XQii
日期:      2023/4/30
调用描述:  初始化S2子板中的icm20608芯片
**********************************************************************************************/
void icm20608_init(uint32_t periph, uint8_t address)
{
    //TODO:
}


/*********************************************************************************************
函数名:    s2_read_bh1750
入口参数:  periph:I2C外设  address:bh1750芯片地址
出口参数： 无
返回值：   无
作者：     XQii
日期:      2023/4/30
调用描述:  从S2子板的bh1750芯片中读取光照强度数据
**********************************************************************************************/
float s2_read_bh1750(uint32_t periph, uint8_t address)
{
    uint8_t buf[2];
    uint16_t result;

    // 发送上电命令
    i2c_cmd_write(periph, address, 0x01);

    // 发送测量命令：连续高分辨率测量
    i2c_cmd_write(periph, address, 0x10);

    // 等待测量结束
    delay_1ms(200);

    // 读取数据
    i2c_direct_read(periph, address, buf, 2);

    // 计算结果
    result = (buf[0] << 8) + buf[1];

    return (float)result / 1.2F;
}
